package cn.iocoder.yudao.module.member.service.praxisProject;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.praxisProject.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.praxisProject.PraxisProjectDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 实践项目 Service 接口
 *
 * @author 管理员
 */
public interface PraxisProjectService {

    /**
     * 创建实践项目
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPraxisProject(@Valid PraxisProjectCreateReqVO createReqVO);

    /**
     * 更新实践项目
     *
     * @param updateReqVO 更新信息
     */
    void updatePraxisProject(@Valid PraxisProjectUpdateReqVO updateReqVO);

    void examinePraxisProject(@Valid PraxisProjectExamineReqVO updateReqVO);

    void submitPraxisProject(Long id);

    void underPraxisProject(Long id);

    void updateShowFlag(Long id);

    /**
     * 删除实践项目
     *
     * @param id 编号
     */
    void deletePraxisProject(Long id);

    /**
     * 获得实践项目
     *
     * @param id 编号
     * @return 实践项目
     */
    PraxisProjectDO getPraxisProject(Long id);

    PraxisProjectRespVO getProjectInfoById( Long id );

    /**
     * 获得实践项目列表
     *
     * @return 实践项目列表
     */
    List<PraxisProjectRespVO> getPraxisProjectList(String title, Integer queryType);

    void saveProjectScheduleVO(PraxisProjectScheduleVO projectVO);

    /**
     * 获得实践项目分页
     *
     * @param pageReqVO 分页查询
     * @return 实践项目分页
     */
    PageResult<PraxisProjectRespVO> getPraxisProjectPage(PraxisProjectPageReqVO pageReqVO);

    void top(Long id,Long projectTypeId);

    PraxisProjectRespVO getPraxisProjectInfoById(Long id,Integer scheduleType);
    void revertPraxisProject(Long id);
    /**
     * 获得实践项目列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 实践项目列表
     */
    List<PraxisProjectDO> getPraxisProjectList(PraxisProjectExportReqVO exportReqVO);

    List<PraxisAnnexVO> getPraxisAnnexListByProjectId(Long relationId, Integer relationType);

    List<PraxisProjectScheduleVO> getScheduleListByProjectId(Long projectId);

    PraxisProjectScheduleVO getNextScheduleByProjectId(Long projectId,Integer scheduleType);

    String validateScheduleTime(List<PraxisProjectScheduleVO> scheduleVOList ,int type);

    String validateUpdateSchedule(List<PraxisProjectScheduleVO> scheduleVOList,Long projectId );

    List<PraxisProjectRecordVO> getRecordByProjectId( Long id);

    PageResult<PraxisFeedBackVO> getFeedBackPageByProjectId(PraxisFeedBackPageReqVO pageVO);
    Integer getProjectCountByTitle(  String title, Long id);

    void updateViewNum(Long id,Long userId);

    PraxisProjectCountVO getPraxisProjectCount(Long id);
}
